/**
 * 多用户登录冲突检测和处理工具
 * 
 * 当同一浏览器中有多个标签页登录不同用户时，
 * token会被覆盖，但sessionStorage中的角色信息可能不匹配，
 * 导致用户信息更新但路由为空的问题
 */

import { log } from '@/config'

/**
 * 验证当前角色是否属于当前用户
 * @param {Object} currentRole - sessionStorage中存储的当前角色
 * @param {Array} userRoles - 当前用户的角色列表
 * @returns {Object|null} - 有效的角色对象或null
 */
export function validateCurrentRole(currentRole, userRoles) {
    if (!currentRole || !userRoles || !Array.isArray(userRoles)) {
        return null;
    }
    
    // 查找匹配的角色
    const validRole = userRoles.find(role => role.id === currentRole.id);
    
    if (!validRole) {
        log.warn("检测到角色不匹配，可能是多用户登录冲突");
        return null;
    }
    
    return validRole;
}

/**
 * 安全获取当前角色
 * @returns {Object|null} - 当前角色对象或null
 */
export function getSafeCurrentRole() {
    try {
        const curRoleStr = sessionStorage.getItem('cur_role');
        if (curRoleStr) {
            return JSON.parse(curRoleStr);
        }
    } catch (err) {
        log.error("解析存储的角色信息出错:", err);
    }
    return null;
}

/**
 * 清除无效的角色信息
 * @param {string} context - 调用上下文，用于日志记录
 */
export function clearInvalidRole(context = '') {
    try {
        sessionStorage.removeItem('cur_role');
        if (context) {
            log.warn(`${context}: 已清除无效的角色信息`);
        }
    } catch (err) {
        log.error("清除角色信息时出错:", err);
    }
}

/**
 * 处理用户信息获取后的角色验证和设置
 * @param {Object} userInfo - 用户信息
 * @param {Function} commit - Vuex commit函数
 * @param {string} context - 调用上下文
 * @returns {Object} - 设置的角色对象
 */
export function handleRoleAfterUserInfo(userInfo, commit, context = '') {
    if (!userInfo || !userInfo.role || !Array.isArray(userInfo.role)) {
        log.error(`${context}: 用户角色信息无效`);
        commit('SET_ROLES', ['ROLE_DEFAULT']);
        return null;
    }
    
    // 获取当前存储的角色
    const currentRole = getSafeCurrentRole();
    
    // 验证角色是否有效
    const validRole = validateCurrentRole(currentRole, userInfo.role);
    
    if (validRole) {
        // 当前角色有效，使用它
        commit('SET_CUR_ROLE', validRole);
        return validRole;
    } else {
        // 当前角色无效或不存在，使用第一个角色
        if (currentRole) {
            clearInvalidRole(context);
        }
        const firstRole = userInfo.role[0];
        commit('SET_CUR_ROLE', firstRole);
        return firstRole;
    }
}

/**
 * 验证路由权限中的角色是否有效
 * @param {Array} routePermissions - 路由权限数据
 * @returns {boolean} - 是否需要清除角色信息
 */
export function validateRouteRole(routePermissions) {
    const currentRole = getSafeCurrentRole();
    
    if (!currentRole || !routePermissions || !Array.isArray(routePermissions)) {
        return false;
    }
    
    // 检查当前角色是否在路由权限中
    const hasValidRole = routePermissions.some(item => 
        item.role && item.role.id === currentRole.id
    );
    
    if (!hasValidRole) {
        clearInvalidRole('路由生成');
        return true;
    }
    
    return false;
}
